package models

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

// APIResponse 统一API响应结构
type APIResponse struct {
	Success bool        `json:"success"`
	Message string      `json:"message"`
	Data    interface{} `json:"data,omitempty"`  // 成功时返回的数据
	Error   interface{} `json:"error,omitempty"` // 错误时返回的错误信息
	Code    int         `json:"code,omitempty"`  // 业务错误代码（可选）
}

// SuccessResponse 成功响应
func SuccessResponse(data interface{}) *APIResponse {
	return &APIResponse{
		Success: true,
		Message: "操作成功",
		Data:    data,
	}
}

// SuccessResponseWithMessage 带自定义消息的成功响应
func SuccessResponseWithMessage(message string, data interface{}) *APIResponse {
	return &APIResponse{
		Success: true,
		Message: message,
		Data:    data,
	}
}

// ErrorResponse 错误响应
func ErrorResponse(message string, err interface{}) *APIResponse {
	return &APIResponse{
		Success: false,
		Message: message,
		Error:   err,
	}
}

// ErrorResponseWithCode 带错误代码的错误响应
func ErrorResponseWithCode(code int, message string, err interface{}) *APIResponse {
	return &APIResponse{
		Success: false,
		Message: message,
		Error:   err,
		Code:    code,
	}
}

// 响应处理辅助函数

// SendSuccess 发送成功响应
func SendSuccess(c *gin.Context, data interface{}) {
	c.JSON(http.StatusOK, SuccessResponse(data))
}

// SendSuccessWithMessage 发送带消息的成功响应
func SendSuccessWithMessage(c *gin.Context, message string, data interface{}) {
	c.JSON(http.StatusOK, SuccessResponseWithMessage(message, data))
}

// SendError 发送错误响应
func SendError(c *gin.Context, statusCode int, message string, err interface{}) {
	c.JSON(statusCode, ErrorResponse(message, err))
}

// SendErrorWithCode 发送带业务错误代码的错误响应
func SendErrorWithCode(c *gin.Context, statusCode int, code int, message string, err interface{}) {
	c.JSON(statusCode, ErrorResponseWithCode(code, message, err))
}

// SendBadRequest 发送400错误响应
func SendBadRequest(c *gin.Context, message string, err interface{}) {
	SendError(c, http.StatusBadRequest, message, err)
}

// SendUnauthorized 发送401错误响应
func SendUnauthorized(c *gin.Context, message string) {
	SendError(c, http.StatusUnauthorized, message, nil)
}

// SendForbidden 发送403错误响应
func SendForbidden(c *gin.Context, message string) {
	SendError(c, http.StatusForbidden, message, nil)
}

// SendNotFound 发送404错误响应
func SendNotFound(c *gin.Context, message string) {
	SendError(c, http.StatusNotFound, message, nil)
}

// SendInternalServerError 发送500错误响应
func SendInternalServerError(c *gin.Context, message string, err interface{}) {
	SendError(c, http.StatusInternalServerError, message, err)
}

// 分页响应结构
type PaginationData struct {
	Items      interface{} `json:"items"`       // 数据列表
	Total      int64       `json:"total"`       // 总数
	Page       int         `json:"page"`        // 当前页
	PageSize   int         `json:"page_size"`   // 每页大小
	TotalPages int         `json:"total_pages"` // 总页数
}

// SendPaginationSuccess 发送分页成功响应
func SendPaginationSuccess(c *gin.Context, items interface{}, total int64, page, pageSize int) {
	totalPages := int((total + int64(pageSize) - 1) / int64(pageSize))
	if totalPages < 1 {
		totalPages = 1
	}

	data := PaginationData{
		Items:      items,
		Total:      total,
		Page:       page,
		PageSize:   pageSize,
		TotalPages: totalPages,
	}

	SendSuccess(c, data)
}
